#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2021/7/2 0:39
# @Author : cjw
from typing import List, Tuple

from appium.webdriver.common.mobileby import MobileBy

from app_wework_po.util.log import logger


def handle_text(text: str, mode: str = 't', is_new: bool = True) -> str:
    """
    android uiautomator根据文本查找元素拼接字符串
    文本定位类型，mode的值：
    t: 文本
    tc：文本包含
    tm：文本正则
    ts：文本起始匹配
    :param text: 查找文本值
    :param mode: 文本查找类型，默认是t，文本查找
    :param is_new: 是否返回带new UiSeclector(),默认是返回
    :return:
    """
    ui_selector = 'new UiSelector()'
    mode = mode.lower()
    if mode == 't':
        selector_text = f'text("{text}")'
    elif mode == 'tc':
        selector_text = f'textContains("{text}")'
    elif mode == 'tm':
        selector_text = f'textMatches("{text}")'
    elif mode == 'ts':
        selector_text = f'textStartsWith("{text}")'
    else:
        logger.error(msg := f'android uiautomator 文本查找类型不存在：{mode}，'
                            f'可选类型：t(文本)，tc(文本包含)，tm(文本正则)，ts(文本起始匹配)')
        raise ValueError(msg)

    # 是否返回带new UiSelector()的字符拼接
    if is_new:
        ui_selector = f'{ui_selector}.{selector_text}'
    else:
        ui_selector = selector_text
    return ui_selector


def handle_texts(first_text: List[str], second_text: List[str], mode: str = 'zh') -> str:
    """
    文本组合定位
    组合定位类型，mode的值：
    zh：组合定位
    cs：父子定位
    fp：兄弟定位
    :param first_text: 组合第一个定位文本和方式(文本内容，查找方式)
    :param second_text: 组合第二个定位文本和查找方式
    :param mode: 组合定位模式，默认是zh
    :return:
    """
    ui_selector = 'new UiSelector()'
    mode = mode.lower()
    # 处理第一个文本定位
    if first_text[-1]:  # 存在定位类型
        ui_selector = f'{ui_selector}.{handle_text(*first_text, is_new=False)}'
    else:  # 不存在定位类型，使用默认文本定位类型
        ui_selector = f'{ui_selector}.{handle_text(first_text[0], "t", False)}'

    # 处理第二个文本定位
    if second_text[-1]:
        ui_second = handle_text(*second_text, is_new=False)
    else:
        ui_second = handle_text(second_text[0], 't', False)

    # 组合方式
    if mode == 'zh':  # 组合定位
        ui_selector = f'{ui_selector}.{ui_second}'
    elif mode == 'cs':  # 父子定位
        ui_selector = f'{ui_selector}.childSelector({ui_second})'
    elif mode == 'fp':  # 兄弟定位
        ui_selector = f'{ui_selector}.fromParent({ui_second})'
    else:
        logger.error(msg := f'android uiautomator 组合定位类型不存在：{mode}，'
                            f'可选值：zh(组合定位)，cs(父子定位)，fp(兄弟定位)')
        raise ValueError(msg)
    return ui_selector


def swipe_find_text(text: str, mode: str = 't') -> str:
    """
    根据文本滑动查找元素，模拟器夜神(安卓版本：7.1.2)用的很好，华为p20真机上就歇菜了
    :param text: 查找的值
    :param mode: 文本匹配方式
    :return:
    """
    ui_selector = f'new UiScrollable(new UiSelector().scrollable(true).instance(0)).' \
                  f'scrollIntoView(new UiSelector().{handle_text(text, mode, False)}.instance(0))'
    return ui_selector


def handle_result(method_value: dict) -> str:
    """
    获取android uiautomator 等处理函数的结果
    :param method_value: 函数方法参数字典：{ 'method': handle_text, 'value': [ 添加成员 ] }
    :return: str
    """
    h_method = method_value.get('method', None)  # 处理方法
    h_value = method_value.get('value', None)  # 调用方法的值

    if h_method:
        h_method = h_method.lower()
        if h_method == 'handle_text':
            result = handle_text(*h_value)
        elif h_method == 'handle_texts':
            result = handle_texts(*h_value)
        elif h_method == 'swipe_find_text':
            result = swipe_find_text(*h_value)
        else:
            logger.error(msg := f'uiautomator拼接方法不存在：{h_method}, 拼接方法值：{h_value}')
            raise ValueError(msg)
        return result
    else:
        logger.error(msg := f'uiautomator拼接方法不能空')
        raise ValueError(msg)


def handle_result_tuple(method_value: dict) -> Tuple[str, str]:
    """
    获取android uiautomator 等处理函数的结果
    :param method_value: 函数方法参数字典
    :return: tuple
    """
    result = handle_result(method_value)
    return MobileBy.ANDROID_UIAUTOMATOR, result


if __name__ == '__main__':
    from app_wework_po.setting import ELEMENT_YML
    from app_wework_po.util.file_operator import YmlOperator

    yml_el = YmlOperator(ELEMENT_YML['amp']).data
    print(handle_result(yml_el['manual_input'][1]))
